#include <sw/redis++/redis++.h>
#include <iostream>
#include <string>
#include <vector>

using namespace sw::redis;

void RetryConnection(Redis &redis)
{
    std::string s1 = redis.ping();
    int cnt = 5;
    while (s1 != "PONG" && cnt)
    {
        --cnt;
        s1 = redis.ping();
    }
}

void unity1(Redis &redis)
{
    printf("开始执行lpush和lpop了\n");
    // 头插
    for (int i = 1; i <= 5; i++)
    {
        redis.lpush("ids", std::to_string(i));
    }

    int len = redis.llen("ids");
    while (len--)
    {
        OptionalString val = redis.lpop("ids");
        if (val.has_value())
            std::cout << val.value() << std::endl;
    }
    printf("-------------------------\n");
}

void unity2(Redis &redis)
{
    printf("开始执行lrange了\n");

    redis.flushall();

    for (int i = 1; i <= 5; i++)
    {
        redis.lpush("ids", std::to_string(i));
    }

    std::vector<std::string> res;
    auto it = std::back_inserter(res);
    redis.lrange("ids", 0, redis.llen("ids"), it);
    for (auto &x : res)
        std::cout << x << "\t";
    std::cout << "\n";
    printf("--------------------------\n");
}

void unity3(Redis &redis)
{
    redis.flushall();
    for (int i = 1; i <= 5; i++)
    {
        redis.rpush("ids", std::to_string(i));
    }

    int len = redis.llen("ids");
    while (len--)
    {
        OptionalString elem = redis.rpop("ids");

        if (elem.has_value())std::cout << elem.value() << "\t";
    }
    printf("--------------------------\n");
}

void unity4(Redis &redis)
{
    printf("开始执行lindex和linsert了\n");

    redis.flushall();
    for (int i = 1; i <= 5; i++)
    {
        redis.rpush("ids", std::to_string(i));
    }
    OptionalString e1 = redis.lindex("ids", 0);
    OptionalString e2 = redis.lindex("ids", 1);
    OptionalString e3 = redis.lindex("ids", 2);
    OptionalString e4 = redis.lindex("ids", 3);
    OptionalString e5 = redis.lindex("ids", 4);

    std::cout<<e1.value()<<"\t"<<e2.value()<<"\t"<<e3.value()<<"\t"<<e4.value()<<"\t"<<e5.value()<<std::endl;

    printf("---------------------------------\n");
    std::vector<std::string> res;
    auto it = std::back_inserter(res);
    int len = redis.linsert("ids",InsertPosition::AFTER,"1","100");
    int end = redis.llen("ids");
    redis.lrange("ids",0,end,it);
    for(auto& x : res) std::cout<<x<<"\t";
    std::cout<<"\n";
}
int main()
{
    Redis redis("tcp://127.0.0.1:6379");
    RetryConnection(redis);
    // unity1(redis);
    // unity2(redis)
    // unity3(redis);
    // unity4(redis);
    return 0;
}